//
// var Plane = function(){
//     this.blood = 100;
//     this.attackLevel = 1;
//     this.defenseLevel = 1;
// };
// var plane = new Plane();
// plane.blood = 500;
// plane.attackLevel = 10;
// plane.defenseLevel = 7;
// var clonePlane = Object.create( plane );
// console.log( clonePlane ); // 输出：Object {blood: 500, attackLevel: 10, defenseLevel: 7}
// //在不支持Object.create 方法的浏览器中，则可以使用以下代码：
// Object.create = Object.create || function( obj ){
//     var F = function(){};
//     F.prototype = obj;
//     return new F();
// }
function Person( name ){
    this.name = name;
};
// Person.prototype.getName = function(){
//     return this.name;
// };
// var a = new Person( 'sven' )
// console.log( a.name ); // 输出：sven
// console.log( a.getName() ); // 输出：sven
// console.log( Object.getPrototypeOf( a ) === Person.prototype ); // 输出：true


function Person( name ){
    this.name = name;
};
Person.prototype.getName = function(){
    return this.name;
};
var objectFactory = function(){
    var obj = new Object(), // 从Object.prototype 上克隆一个空的对象
        Constructor = [].shift.call( arguments ); // 取得外部传入的构造器，此例是Person
    obj.__proto__ = Constructor.prototype; // 指向正确的原型
    var ret = Constructor.apply( obj, arguments ); // 借用外部传入的构造器给obj 设置属性
    return typeof ret === 'object' ? ret : obj; // 确保构造器总是会返回一个对象
};
var a = objectFactory( Person, 'sven' );
console.log( a.name ); // 输出：sven
console.log( a.getName() ); // 输出：sven
console.log( Object.getPrototypeOf( a ) === Person.prototype ); // 输出：true
//我们看到，分别调用下面两句代码产生了一样的结果：
